package me.fanwu;

/*
 * Wupher 编写于 16/8/8.
 */

import com.google.common.collect.Range;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

/**
 * 计时消费方案的模拟,一份计时消费是方案包含多个时段计费价格
 */
public class TimeCapculation {

    public static int TIME_LIMIT = 24 * 60; //一天的最大时间

    /**
     * 时段列表, 一份计时计费由多个时段列表来组成
     */
    private List<TimeSlice> timeConfig = new ArrayList<>();

    public TimeCapculation(TimeSlice... args) {
        Collections.addAll(timeConfig, args);
    }

    /**
     * 时间划分,将给定的时段,根据计费时段进行划分
     *
     * @param planStartTime 整个活动的计费开始时间
     * @param planEndTime   整个活动的计费结束时间
     * @return 返回的划分列表
     */
    public List<TimeSlice> cutTimeSlice(Integer planStartTime, Integer planEndTime) {

        if (planEndTime > TIME_LIMIT) { //出现结束日期跨天
            List<TimeSlice> result1 = cutTimeSlice(planStartTime, TIME_LIMIT);
            List<TimeSlice> result2 = cutTimeSlice(0, planEndTime - TIME_LIMIT);
            result1.addAll(result2);
            return result1;
        }

        for (TimeSlice slice : timeConfig) {
            Range<Integer> sliceRange = slice.getSlice();
            if (sliceRange.contains(planEndTime) && sliceRange.contains(planStartTime)) {
                //活动开始时间与活动结束时间都落在当前时段区间内
                //最简单的处理情况
                return newArrayList(new TimeSlice(planStartTime, planEndTime, slice.getPrice()));
            }

            if (sliceRange.contains(planStartTime) && !sliceRange.contains(planEndTime)) {
                //活动相交:开始时间落在当前时段区间内,但是结束区间超出了当前时段区间
                //切分
                TimeSlice leftJoin = new TimeSlice(planStartTime, slice.getEndTime(), slice.getPrice());
                List<TimeSlice> rightJoins = cutTimeSlice(slice.getEndTime(), planEndTime);
                rightJoins.add(leftJoin);
                return rightJoins; //返回两者相加
            }

            if (sliceRange.contains(planEndTime) && !sliceRange.contains(planStartTime)) {
                //活动相交:右交,结束时间落在当前时段区间内,但是开始时间超出当前时段区间
                TimeSlice rightJoin = new TimeSlice(slice.getStartTime(), planEndTime, slice.getPrice());
                List<TimeSlice> leftJoins = cutTimeSlice(planStartTime, slice.getEndTime());
                leftJoins.add(rightJoin);
                return leftJoins;//返回两者相加
            }

            //剩下一种是两集合完全不相重,直接返回继续递归
        }
        return new ArrayList<>(); //返回一个空对象
    }

}
